package com.zhiyou100.test.test01.reflect;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author yang
 * @className Demo03Method
 * @packageName com.zhiyou100.test.test01.reflect
 * @Description TODO method 的 方法
 * @date 2020-08-06 13:04
 */
public class Demo03Method {
    public static void main(String[] args) throws Exception {

        Class c1=Class.forName("com.zhiyou100.test.test01.reflect.Student");
        //Method类的方法：
        //1   String getName()                 获取方法名
        //2   Class<?> getReturnType()         获取方法返回值类型
        //3   Class<?>[] getParameterTypes()   获取方法的参数类型
        //4   Object invoke(Object o, Object... args)   调用方法：调用o的当前方法 并传递参数args
        //                               返回值为 方法调用后的返回值
        //5   void setAccessible(boolen b) 是否取消对编译器的检查

        Method[] methods=c1.getDeclaredMethods();
        // 创建对象
        Object s = c1.getDeclaredConstructor(int.class, char.class, String.class, int.class).newInstance(19, '男', "呵呵呵", 100);
        for (Method m : methods) {
            System.out.println("方法名：：："+m.getName());
            System.out.println("方法返回值类型：：："+m.getReturnType());
            System.out.println("方法参数列表：：："+Arrays.toString(m.getParameterTypes()));
            System.out.println("--------");
        }
        //s.add(a)
        //调用方法:::int add(int a)
        Method method=c1.getDeclaredMethod("add", int.class);
        method.setAccessible(true);
        //方法调用前暴力访问
        Object result=method.invoke(s, 1);
        System.out.println(result);
    }
}
